<?php

/**
 * 搜索接口基类，实现了公共方法
 * @author huang
 * @copyright (c) 2013年7月24日 14:48:19 
 */
abstract class SearchBase {
    
    protected   $_servicePath = '',
                $_searchUrl = '',
                $_response = null,
                $_docs = null,
                $_count = 0 ,
                $_query = '',
                $_returnData = array(),
                $_urlParams = '',
                $_params = array(
                   'start' =>0,
                   'rows' => 5,
                   'sort' => '',
                   'fl' =>'',
                   'wt' => 'json'
               );
    
    /**
     * 设置搜索结果起始数并重置URL参数
     * @author huang
     * @param type $start
     * @return \SearchService
     * @copyright 2013年7月24日 10:56:51
     */
    public function setStart($start = 0){
        $this->_params['start'] = $start;
        return $this;
    }
    
    /**
     * 设置搜索结果返回条数并重置URL参数
     * @author huang
     * @param type $rows
     * @return \SearchService
     * @copyright 2013年7月24日 10:56:51
     */
    public function setRows($rows = 5){
        $this->_params['rows'] = $rows;
        return $this; 
    }
    
    /**
     * 设置搜索结果排序方式并重置URL参数
     * @author huang
     * @param type $sort
     * @return \SearchService
     * @copyright 2013年7月24日 10:56:51
     */
    public function setSort($sort = 0){
        $this->_params['sort'] = $sort;
        return $this;
    }
    
    /**
     * 设置搜索结果字段过滤并重置URL参数
     * @author huang
     * @param type $fields
     * @return \SearchService
     * @copyright 2013年7月24日 10:56:51
     */
    public function setFields($fields = ''){
        $this->_params['fl'] = $fields;
        return $this;
    }
    
    /**
     * 设置搜索结果然会类型并重置URL参数
     * @author huang
     * @param type $type
     * @return \SearchService
     * @example (PHP|JSON|XML)
     * @copyright 2013年7月24日 10:56:51
     */
    public function setReturnType($type = ''){
        $this->_params['wt'] = $type;
        return $this;
    }
   
    /**
     * 获取搜索到原始结果集，不包含搜索参数
     * @author huang
     * @return object $this->_docs 
     * @copyright 2013年7月24日 10:56:51
     */
    public function getDocs(){
        return $this->_docs;
    }
    
    /**
     * 获取搜索到结果的总数量大小
     * @author huang
     * @return integer $this->_count 
     */
    public function getSum(){
        return $this->_count;
    }
    
    /**
     * 获取转换后结果集
     * @author huang
     * @return array $this->_returnData
     * @copyright 2013年7月24日 10:56:51
     */
    public function getResult(){
        return $this->_returnData;
    }
    
    /**
     * 获取当前查询的关键字
     * @author huang
     * @return string $this->_query
     * @copyright 2013年7月24日 10:56:51
     */
    public function getQueryString(){
        return $this->_query;
    }
    
    /**
     * 魔术函数，输出耗时和总数
     * @author huang
     * @return string 
     * @copyright 2013年7月24日 10:56:51
     */
    public function __toString() {
        if(!is_null($this->_response)){
            return sprintf('本次查询总共消耗时间：%s秒，共查询到记录：%s条，返回记录：%s条',$this->_response->responseHeader->QTime,$this->_count,$this->_params['rows']);
        }
        return '';
    }
    
     /**
     * 搜索并获取返回值并给统计参数与返回数据赋值
     * @author huang
     * @param string $query 搜索字符串
     * @return true
     * @copyright 2013年7月24日 10:56:51
     */
     protected function search($query = ''){
      
        try{
            $this->_params['q'] = $this->_query = strip_tags($query);
            $this->_urlParams = http_build_query($this->_params);
            $this->_searchUrl = $this->_servicePath . $this->_urlParams;
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $this->_searchUrl);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt ($curl, CURLOPT_TIMEOUT, 5);
            $this->_response = curl_exec($curl);
            curl_close($curl);
           
            if(!$this->_response){
                throw new Exception('搜索服务无响应！');
            }
            
            $this->_response = json_decode($this->_response);
            if(is_object($this->_response)){
                
                if(property_exists($this->_response, 'error')){
                    $this->_count = 0;
                    Yii::log('返回错误！ERROR:'.$this->_response->error->msg,'error','search');
                    return;
                }
                
                $this->_docs = $this->_response->response->docs;
                $this->_count = $this->_response->response->numFound;
                
                if($this->_count > 0){
                    $this->transformResponse();
                }
                
            }else{
              throw new Exception('返回数据格式错误！');
            }
            
            return  true;
        }  catch (Exception $e){
            echo 'ERROR:'.$e->getMessage();
        }
    }
    
    /**
     * 转换结果集
     * @author huang 
     * @copyright 2013年7月24日 10:56:51
     */
    abstract protected function transformResponse();
    
}
?>
